import settings, { getBaseUrl, getEnv } from "./settings"
import { login, showModal, showToast, valIsEmpty } from "../utils/index"
import store from "../store"
import { userActionType } from "./../store/modules/user"

/**
 * 发送网络请求
 * @param config 请求配置，里面包含 uni.request 的默认属性，以及一些自定义属性，如下：errorHandle: 是否自动处理错误信息；origin: 是否返回原始数据；showLoading: 是否显示加载中；noAuth：是否不需要鉴权，请求头无需带上token（一般是登录请求）
 * @returns {Promise<unknown>}
 */
const request = (config) => {
  const promise = new Promise(async (resolve, reject) => {
    if (config.showLoading) {
      uni.showLoading({
        title: "加载中",
        mask: true,
      })
    }
    //带上请求头，用于鉴权
    let token
    if (!config.noAuth) {
      const userInfo = await store.dispatch(userActionType.action.userInfo)
      token = userInfo.token
    }
    let url
    // 判断是否是完整的url
    if (config.url.startsWith("http")) {
      url = config.url
    } else {
      url = getBaseUrl() + config.url
    }
    uni.request({
      ...config,
      url: url,
      method: config.method ? config.method.toUpperCase() : "post", //默认的请求方法是post方法
      header: {
        [settings.tokenKey]: token,
        ...config.header,
      },
      fail: (err) => {
        console.log(err, "err")
        if (config.showLoading) {
          uni.hideLoading()
        }
        if (config.errorHandle) {
          showModal({
            title: "提示",
            content: "网络错误，请稍后再试",
            showCancel: false,
          }).then(() => {
            //返回首页
            uni.reLaunch({
              url: "/pages/index/index",
            })
          })
        }
        reject("网络错误")
      },
      success: (res) => {
        //打印请求信息
        if (["develop", "trial"].includes(getEnv()) && settings.debug) {
          console.log("\n")
          console.log(url, "请求路径")
          console.log(config.data, "请求参数")
          console.log(res.data, "返回结果")
          console.log("\n")
        }
        // 如果配置了config.origin则返回原始数据, 否则返回data里面的数据
        let resolveData
        if (config.origin) {
          if (config.showLoading) {
            uni.hideLoading()
          }
          resolve(res)
          return
        } else {
          resolveData = res.data.data
        }
        if (config.showLoading) {
          uni.hideLoading()
        }
        //请求成功
        switch (res.data.code + "") {
          //请求成功
          case "200":
          case "0":
          case "1":
            resolve(resolveData)
            break
          //token已过期或者不存在
          case "603":
          case "606":
          case "600":
            if (config.noAuth) return
            //防止出现死循环
            if (valIsEmpty(config.reTryLoopCountLimit)) {
              config.reTryLoopCountLimit = 1
            }
            config.reTryLoopCountLimit--
            if (config.reTryLoopCountLimit < 0) {
              reject(res.data.msg)
              return
            }
            //清除登陆状态
            store.commit(userActionType.mutations.setUserInfo, null)
            //重新请求（在此之前会自动登录）
            request(config)
              .then((res) => {
                resolve(res)
              })
              .catch((err) => {
                reject(err)
              })
            break
          default:
            //异常处理
            console.log(res, "err")
            if (res && res.data && res.data.msg) {
              if (config.errorHandle) {
                showToast.default(res.data.msg)
              }
              reject(res.data.msg)
            } else {
              if (config.errorHandle) {
                showToast.default(JSON.stringify(res))
              }
              reject(JSON.stringify(res))
            }
            break
        }
      },
    })
  })
  return promise
}

export default request
